Guice Module হলো Google Guice-এর একটি কেন্দ্রীয় উপাদান যা Dependency Injection (DI) পদ্ধতিতে নির্দিষ্ট ডিপেনডেন্সি ম্যাপিং বা বাইন্ডিং সংজ্ঞায়িত করে। এটি মূলত Guice-কে জানায় যে, কিভাবে নির্দিষ্ট ইন্টারফেস বা অবজেক্ট গুলি তাদের বাস্তবায়নের (implementation) সাথে সংযুক্ত হতে হবে।
Guice Module কী?
- Guice Module হলো একটি ক্লাস যা
com.google.inject.AbstractModuleথেকে ইনহেরিট করে। - এটি Guice-এর
configure()মেথড ওভাররাইড করে প্রয়োজনীয় বাইন্ডিং বা ডিপেনডেন্সি ম্যাপিং তৈরি করে। - Module ব্যবহার করে আপনি সহজে ডিপেনডেন্সি ম্যানেজ করতে পারেন, যেমন কোন ইন্টারফেসের জন্য কোন ইমপ্লিমেন্টেশন ব্যবহার করা হবে।
Guice Module কীভাবে কাজ করে?
- ম্যাপিং তৈরি করা:
- Module এ বাইন্ডিং সংজ্ঞায়িত করা হয়। উদাহরণস্বরূপ, একটি ইন্টারফেস (Interface) এর জন্য একটি নির্দিষ্ট ইমপ্লিমেন্টেশন (Implementation) বাইন্ড করা হয়।
- Injector তৈরি করা:
- Guice একটি Injector তৈরি করে, যা মডিউলে সংজ্ঞায়িত বাইন্ডিং ব্যবহার করে নির্দিষ্ট ডিপেনডেন্সি সরবরাহ করে।
- ডিপেনডেন্সি রেজোলভ করা:
- Injector ক্লায়েন্ট কোডে ডিপেনডেন্সি ইনজেক্ট করে, যেখানে প্রয়োজনীয় অবজেক্ট সরবরাহ করা হয়।
Guice Module এর উদাহরণ
1. Module তৈরি করা
AbstractModule ক্লাস থেকে ইনহেরিট করে একটি Module তৈরি করা হয় এবং configure() মেথডে বাইন্ডিং সংজ্ঞায়িত করা হয়।
import com.google.inject.AbstractModule;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
// Service ইন্টারফেসের জন্য ServiceImpl ইমপ্লিমেন্টেশন নির্ধারণ
bind(Service.class).to(ServiceImpl.class);
}
}
2. একটি Interface এবং Implementation তৈরি করা
Module এর বাইন্ডিং অনুযায়ী একটি ইন্টারফেস এবং তার ইমপ্লিমেন্টেশন তৈরি করা হয়।
// Interface
public interface Service {
void performTask();
}
// Implementation
public class ServiceImpl implements Service {
@Override
public void performTask() {
System.out.println("Task performed by ServiceImpl.");
}
}
3. Main Application এ Injector ব্যবহার
Injector তৈরি করে Module এর বাইন্ডিং অনুযায়ী ডিপেনডেন্সি রেজোলভ করা হয়।
import com.google.inject.Guice;
import com.google.inject.Injector;
public class MainApp {
public static void main(String[] args) {
// Injector তৈরি এবং Module লোড করা
Injector injector = Guice.createInjector(new AppModule());
// Service ডিপেনডেন্সি রেজোলভ করা
Service service = injector.getInstance(Service.class);
// মেথড কল করা
service.performTask();
}
}
Guice Module এর সুবিধা
- Decoupled Code:
- কোডের বিভিন্ন অংশের মধ্যে tight coupling কমিয়ে দেয়। ইন্টারফেস ব্যবহার করে আপনি সহজেই নতুন ইমপ্লিমেন্টেশন যুক্ত করতে পারেন।
- Reusable:
- একটি Module একাধিক প্রোজেক্ট বা পরিবেশে পুনরায় ব্যবহার করা যায়।
- Flexible Binding:
- Constructor Injection, Field Injection এবং Method Injection সহজেই সম্ভব।
- Testability:
- Unit Testing এর জন্য মক বা বিকল্প ইমপ্লিমেন্টেশন ব্যবহার করা যায়।
বাইন্ডিং এর অন্যান্য বৈশিষ্ট্য
1. নির্দিষ্ট Instance বাইন্ডিং
একটি নির্দিষ্ট অবজেক্টকে বাইন্ড করা যায়।
bind(String.class).toInstance("Hello, Guice!");
2. Constructor Binding
কোন ক্লাসের নির্দিষ্ট কনস্ট্রাক্টর ব্যবহার করতে বাধ্য করা যায়।
bind(Service.class).toConstructor(ServiceImpl.class.getConstructor(String.class));
3. Scoped Binding
Singleton বা Custom Scope নির্ধারণ করা যায়।
bind(Service.class).to(ServiceImpl.class).in(Singleton.class);
Module-এর Complex উদাহরণ
মাল্টিপল মডিউল ব্যবহার এবং চেইনিং করার সুবিধা।
import com.google.inject.Guice;
import com.google.inject.Injector;
public class MultiModuleApp {
public static void main(String[] args) {
// একাধিক Module লোড করা
Injector injector = Guice.createInjector(new AppModule(), new AnotherModule());
// Service ডিপেনডেন্সি রেজোলভ করা
Service service = injector.getInstance(Service.class);
service.performTask();
}
}
- Guice Module Dependency Injection-এর মাধ্যমে কোডের মডুলারিটি এবং রিইউসেবিলিটি বাড়ায়।
AbstractModuleক্লাস ব্যবহার করে বাইন্ডিং তৈরি করা হয় এবং Injector এর মাধ্যমে প্রয়োজনীয় ডিপেনডেন্সি সরবরাহ করা হয়।- Guice Module আপনার প্রোজেক্টকে আরও মেইনটেইনেবল ও স্কেলেবল করে তোলে।